Redo font map support in GtkFontChooser
authorMatthias Clasen <mclasen@redhat.com>
Sat, 13 Jun 2015 03:55:30 +0000 (23:55 -0400)
committerMatthias Clasen <mclasen@redhat.com>
Sat, 13 Jun 2015 04:00:51 +0000 (00:00 -0400)
We can't add properties to the interface, since it breaks
3rd party implementations of the GtkFontChooser interface.
These exist, for example in gnumeric.

So, instead of a new property, add getter/setter vfuncs.

gtk/gtkfontbutton.c
gtk/gtkfontchooser.c
gtk/gtkfontchooser.h
gtk/gtkfontchooserutils.c
gtk/gtkfontchooserutils.h
gtk/gtkfontchooserwidget.c

index 492c4d297b15c225d0af841c1ccdb584bd2c8f94..98620c15b0e881f813f5eb3c525087a5acba5af0 100644 (file)
@@ -386,9 +386,11 @@ gtk_font_button_get_font_desc (GtkFontButton *font_button)
 }
 
 static void
-gtk_font_button_set_font_map (GtkFontButton *font_button,
-                              PangoFontMap  *font_map)
+gtk_font_button_font_chooser_set_font_map (GtkFontChooser *chooser,
+                                           PangoFontMap   *font_map)
 {
+  GtkFontButton *font_button = GTK_FONT_BUTTON (chooser);
+
   if (g_set_object (&font_button->priv->font_map, font_map))
     {
       PangoContext *context;
@@ -398,11 +400,17 @@ gtk_font_button_set_font_map (GtkFontButton *font_button,
 
       context = gtk_widget_get_pango_context (font_button->priv->font_label);
       pango_context_set_font_map (context, font_map);
-
-      g_object_notify (G_OBJECT (font_button), "font-map");
     }
 }
 
+static PangoFontMap *
+gtk_font_button_font_chooser_get_font_map (GtkFontChooser *chooser)
+{
+  GtkFontButton *font_button = GTK_FONT_BUTTON (chooser);
+
+  return font_button->priv->font_map;
+}
+
 static void
 gtk_font_button_font_chooser_notify (GObject    *object,
                                      GParamSpec *pspec,
@@ -421,6 +429,8 @@ gtk_font_button_font_chooser_iface_init (GtkFontChooserIface *iface)
   iface->get_font_face = gtk_font_button_font_chooser_get_font_face;
   iface->get_font_size = gtk_font_button_font_chooser_get_font_size;
   iface->set_filter_func = gtk_font_button_font_chooser_set_filter_func;
+  iface->set_font_map = gtk_font_button_font_chooser_set_font_map;
+  iface->get_font_map = gtk_font_button_font_chooser_get_font_map;
 }
 
 G_DEFINE_TYPE_WITH_CODE (GtkFontButton, gtk_font_button, GTK_TYPE_BUTTON,
@@ -655,9 +665,6 @@ gtk_font_button_set_property (GObject      *object,
     case PROP_SHOW_SIZE:
       gtk_font_button_set_show_size (font_button, g_value_get_boolean (value));
       break;
-    case GTK_FONT_CHOOSER_PROP_FONT_MAP:
-      gtk_font_button_set_font_map (font_button, g_value_get_object (value));
-      break;
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
       break;
@@ -702,9 +709,6 @@ gtk_font_button_get_property (GObject    *object,
     case PROP_SHOW_SIZE:
       g_value_set_boolean (value, gtk_font_button_get_show_size (font_button));
       break;
-    case GTK_FONT_CHOOSER_PROP_FONT_MAP:
-      g_value_set_object (value, font_button->priv->font_map);
-      break;
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
       break;
index d295ce042c01bb4837fe9455acb603b45abc869d..e2ed3a0188921ce0aa2d7d4b08fef5ee11027fd1 100644 (file)
@@ -105,18 +105,6 @@ gtk_font_chooser_default_init (GtkFontChooserInterface *iface)
                           TRUE,
                           GTK_PARAM_READWRITE|G_PARAM_EXPLICIT_NOTIFY));
 
-  /**
-   * GtkFontChooser:font-map:
-   *
-   * A custom font map to use for this widget, instead of the
-   * default one.
-   *
-   * Since: 3.18
-   */
-  g_object_interface_install_property (iface,
-      g_param_spec_object ("font-map", P_("Font map"), P_("A custom PangoFontMap"),
-                           PANGO_TYPE_FONT_MAP,
-                           GTK_PARAM_READWRITE|G_PARAM_EXPLICIT_NOTIFY));
   /**
    * GtkFontChooser::font-activated:
    * @self: the object which received the signal
@@ -466,7 +454,8 @@ gtk_font_chooser_set_font_map (GtkFontChooser *fontchooser,
   g_return_if_fail (GTK_IS_FONT_CHOOSER (fontchooser));
   g_return_if_fail (fontmap == NULL || PANGO_IS_FONT_MAP (fontmap));
 
-  g_object_set (fontchooser, "font-map", fontmap, NULL);
+  if (GTK_FONT_CHOOSER_GET_IFACE (fontchooser)->set_font_map)
+    GTK_FONT_CHOOSER_GET_IFACE (fontchooser)->set_font_map (fontchooser, fontmap);
 }
 
 /**
@@ -483,11 +472,12 @@ gtk_font_chooser_set_font_map (GtkFontChooser *fontchooser,
 PangoFontMap *
 gtk_font_chooser_get_font_map (GtkFontChooser *fontchooser)
 {
-  PangoFontMap *fontmap;
+  PangoFontMap *fontmap = NULL;
 
   g_return_val_if_fail (GTK_IS_FONT_CHOOSER (fontchooser), NULL);
 
-  g_object_get (fontchooser, "font-map", &fontmap, NULL);
+  if (GTK_FONT_CHOOSER_GET_IFACE (fontchooser)->get_font_map)
+    fontmap = GTK_FONT_CHOOSER_GET_IFACE (fontchooser)->get_font_map (fontchooser);
 
   return fontmap;
 }
index 84693c1fe4fd503ba149aa5ddde79fbddb68b29c..98e3baf7e29fadbbdcb3707e830ecd4d2101c386 100644 (file)
@@ -70,8 +70,13 @@ struct _GtkFontChooserIface
   void (* font_activated) (GtkFontChooser *chooser,
                            const gchar    *fontname);
 
+  /* More methods */
+  void              (* set_font_map)            (GtkFontChooser   *fontchooser,
+                                                 PangoFontMap     *map);
+  PangoFontMap *    (* get_font_map)            (GtkFontChooser   *fontchooser);
+
    /* Padding */
-  gpointer padding[12];
+  gpointer padding[10];
 };
 
 GDK_AVAILABLE_IN_3_2
index ff8ca68110f419391ddfe2dc6d0d6e9b178809b5..36ebd8bcd06480aa82412331914cef4cbe70ff9d 100644 (file)
@@ -63,6 +63,19 @@ delegate_set_filter_func (GtkFontChooser    *chooser,
                                     data_destroy);
 }
 
+static void
+delegate_set_font_map (GtkFontChooser *chooser,
+                       PangoFontMap   *map)
+{
+  gtk_font_chooser_set_font_map (get_delegate (chooser), map);
+}
+
+static PangoFontMap *
+delegate_get_font_map (GtkFontChooser *chooser)
+{
+  return gtk_font_chooser_get_font_map (get_delegate (chooser));
+}
+
 static void
 delegate_notify (GObject    *object,
                  GParamSpec *pspec,
@@ -121,9 +134,6 @@ _gtk_font_chooser_install_properties (GObjectClass *klass)
   g_object_class_override_property (klass,
                                     GTK_FONT_CHOOSER_PROP_SHOW_PREVIEW_ENTRY,
                                     "show-preview-entry");
-  g_object_class_override_property (klass,
-                                    GTK_FONT_CHOOSER_PROP_FONT_MAP,
-                                    "font-map");
 }
 
 /**
@@ -144,6 +154,8 @@ _gtk_font_chooser_delegate_iface_init (GtkFontChooserIface *iface)
   iface->get_font_face = delegate_get_font_face;
   iface->get_font_size = delegate_get_font_size;
   iface->set_filter_func = delegate_set_filter_func;
+  iface->set_font_map = delegate_set_font_map;
+  iface->get_font_map = delegate_get_font_map;
 }
 
 /**
index 0a8f9f8d8da8c3a8df3648cb248b1b501e88e430..7c92a649476cd38e7c53767527832006d2d82061 100644 (file)
@@ -37,7 +37,6 @@ typedef enum {
   GTK_FONT_CHOOSER_PROP_FONT_DESC,
   GTK_FONT_CHOOSER_PROP_PREVIEW_TEXT,
   GTK_FONT_CHOOSER_PROP_SHOW_PREVIEW_ENTRY,
-  GTK_FONT_CHOOSER_PROP_FONT_MAP,
   GTK_FONT_CHOOSER_PROP_LAST
 } GtkFontChooserProp;
 
index 7464f74fe862bea562c2b5d3a8477f28ac75df1d..f519b82cd9e485475f88c21cc64391500f77476c 100644 (file)
@@ -171,8 +171,6 @@ static void     gtk_font_chooser_widget_cell_data_func         (GtkTreeViewColum
                                                                GtkTreeModel      *tree_model,
                                                                GtkTreeIter       *iter,
                                                                gpointer           user_data);
-static void    gtk_font_chooser_widget_set_font_map            (GtkFontChooserWidget *fontchooser,
-                                                                PangoFontMap         *fontmap);
 
 static void gtk_font_chooser_widget_iface_init (GtkFontChooserIface *iface);
 
@@ -203,9 +201,6 @@ gtk_font_chooser_widget_set_property (GObject         *object,
     case GTK_FONT_CHOOSER_PROP_SHOW_PREVIEW_ENTRY:
       gtk_font_chooser_widget_set_show_preview_entry (fontchooser, g_value_get_boolean (value));
       break;
-    case GTK_FONT_CHOOSER_PROP_FONT_MAP:
-      gtk_font_chooser_widget_set_font_map (fontchooser, g_value_get_object (value));
-      break;
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
       break;
@@ -234,9 +229,6 @@ gtk_font_chooser_widget_get_property (GObject         *object,
     case GTK_FONT_CHOOSER_PROP_SHOW_PREVIEW_ENTRY:
       g_value_set_boolean (value, gtk_font_chooser_widget_get_show_preview_entry (fontchooser));
       break;
-    case GTK_FONT_CHOOSER_PROP_FONT_MAP:
-      g_value_set_object (value, fontchooser->priv->font_map);
-      break;
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
       break;
@@ -1231,9 +1223,10 @@ gtk_font_chooser_widget_set_show_preview_entry (GtkFontChooserWidget *fontchoose
 }
 
 static void
-gtk_font_chooser_widget_set_font_map (GtkFontChooserWidget *fontchooser,
-                                      PangoFontMap         *fontmap)
+gtk_font_chooser_widget_set_font_map (GtkFontChooser *chooser,
+                                      PangoFontMap   *fontmap)
 {
+  GtkFontChooserWidget *fontchooser = GTK_FONT_CHOOSER_WIDGET (chooser);
   GtkFontChooserWidgetPrivate *priv = fontchooser->priv;
 
   if (g_set_object (&priv->font_map, fontmap))
@@ -1255,6 +1248,15 @@ gtk_font_chooser_widget_set_font_map (GtkFontChooserWidget *fontchooser,
     }
 }
 
+static PangoFontMap *
+gtk_font_chooser_widget_get_font_map (GtkFontChooser *chooser)
+{
+  GtkFontChooserWidget *fontchooser = GTK_FONT_CHOOSER_WIDGET (chooser);
+  GtkFontChooserWidgetPrivate *priv = fontchooser->priv;
+
+  return priv->font_map;
+}
+
 static void
 gtk_font_chooser_widget_set_filter_func (GtkFontChooser  *chooser,
                                          GtkFontFilterFunc filter,
@@ -1281,4 +1283,6 @@ gtk_font_chooser_widget_iface_init (GtkFontChooserIface *iface)
   iface->get_font_face = gtk_font_chooser_widget_get_face;
   iface->get_font_size = gtk_font_chooser_widget_get_size;
   iface->set_filter_func = gtk_font_chooser_widget_set_filter_func;
+  iface->set_font_map = gtk_font_chooser_widget_set_font_map;
+  iface->get_font_map = gtk_font_chooser_widget_get_font_map;
 }